#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <map>
#include <queue>
#include <list>

#define sf(x) scanf("%d", &x)
#define pf(x) printf("%d", x)
#define pf2(x,y) printf("%d %d ", x,y)
#define sf2(x,y) scanf("%d %d", &x,&y)
#define sff(x) scanf("%lf", &x)
#define pff(x) printf("%lf ", x)
#define ENDL printf("\n")
#define pfl(x) printf("%I64d ", x)
#define sfl(x) scanf("%I64d", &x)
#pragma warning(disable:4996)
using namespace std;

typedef long long ll;

bool a[37][1001];
bool flags[37];
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);

	int n, m, q;
	scanf("%d%d%d", &n, &m, &q);
	char s;
	bool flag;
	int o=0;
	for(int i=0;i<1000000000;i++)
    {
    	o=o++;
    }
	while (n != 0 || m != 0 || q != 0)
	{
		/*
		if (q==0)
		{
		if (m!=1 || n!=1)
		{
		for (int i=0 ; i< m; i++)
		{
		printf("?");
		}
		}
		else
		{
		printf("0");
		}
		}
		*/
		for (int i = 0; i<q; i++)
		{
			for (int j = 0; j < n; j++)
			{
				scanf(" %c", &s);
				if (s == '1')
				{
					flags[j] = !flags[j];
				}
			}
			for (int k = 0; k < m; k++)
			{
				scanf(" %c", &s);
				for (int j = 0; j < n; j++)
				{
					if (flags[j])
					{
						if (s == '0') a[j][k] = 1;
					}
					else
					{
						if (s == '1') a[j][k] = 1;
					}
				}
			}
		}

		for (int i = 0; i<m; i++)
		{
			flag = false;
			for (int k = 0; k<n; k++)
			{
				if (flag && a[k][i] == 0)
				{
					flag = false;
					break;
				}
				if (a[k][i] == 0)
				{
					flag = true;
					o = k;
				}
			}
			if (!flag) printf("?");
			else
			{
				if (o>9)
				{
					printf("%c", o - 10 + 'A');
				}
				else
				{
					pf(o);
				}
			}
		}
		ENDL;

		for (int i = 0; i<n; i++)
		{
			for (int j = 0; j<m; j++)
			{
				a[i][j] = 0;
			}
			flags[i] = 0;
		}
		scanf("%d%d%d", &n, &m, &q);
	}

	return 0;
}